通常我們在評估一個演算法好壞,最常下手的時間複雜度Time complexity。
簡單來說,就是整個程式需要執行多久,我們一般會用大O符號來表示。
以我們之前寫過的題目來做範例好了。
import java.util.Stack
fun main(){
var s = Stack<Char>()
var inp = readln()
var match = true;
for(i in 0 .. inp.length-1){
if(inp[i]=='('){
s.push(inp[i])
}
if(inp[i]==')'){
if(s.empty()!=true){
s.pop()
}
else{
match = false;
}
}
}
if(match){
println("Yes")
}
else{
println("NO")
}
}
我們可以把所有的運算比如變數宣告、輸入、輸出、判斷……當成一次基本運算,所以我們來算一下總共有多少基本運算。
1
1
1
(inp.length-1) * (
1
1
1
1
1
1
)
1
1
1
總共是 6 + 6*(輸入長度-1) 次基本運算 ,這裡的輸入長度我們用N代替,也就是6N-6+6,大約是6N次基本運算。(因為後面會忽略低冪次跟係數,所以其實大概估算就好,不需要真的算的很清楚)
接下來我們只保留最高冪次,也忽略他的係數,所以比如說6N的結果就是N,我們記做「O(N)」。
我們就可以說這個程式碼是O(N)時間複雜度的,大家就可以很快知道大概會執行多久。(差不多8~12萬基本運算會是一秒喔,不過每個運算的時間都不一樣,所以不一定保證就是這麼剛好,但這是一個很好的估算方法。)
這裡有兩段程式碼,請你預估他的時間複雜度。
fun main(){
var n = readln().toInt()
var a = 1
var b = 1
for(i in 1..n){
var temp = a + b
a = b
b = temp
}
println("$b")
}
fun main(){
var n = readln().toInt()
for(i in 1..n){
for(j in 1..n){
println("${i} * ${j} = ${i*j}")
}
}
}